library(raster)
library(sf)
library(tmap) # for making the nice plot
library(osmdata)
library(OpenStreetMap)
library(tidyverse)
library(terra)
library(spDataLarge)
library(stars)
library(ggplot2)
library(dplyr)
library(tmaptools)
ontario_bbox <- c(left = -95.1537, right = -74.3202, bottom = 41.6766, top = 56.8566)
# Query OpenStreetMap for administrative boundaries of Toronto
ontario_border <- opq(bbox = ontario_bbox, timeout=120) |>
add_osm_feature(key = "boundary", value = "administrative") |>
add_osm_feature(key = "ISO3166-2", value = "CA-ON") |>
add_osm_feature(key = "admin_level", value = "4") |>
add_osm_feature(key = "type", value = "boundary") |>
add_osm_feature(key = "wikidata", value = "Q1904") |>
add_osm_feature(key = "name:en", value = "Ontario") |>
osmdata_sf() |>
(\(x) x$osm_multipolygons)() |>
select(osm_id,admin_level,border_type,name,boundary)
ontario_border = st_transform(ontario_border, crs = 4326)
ontario_basemap = read_osm(ontario_border, type = "esri-topo")
ontario_border = st_transform(ontario_border, st_crs(ontario_basemap))
ontario_cropped <- st_crop(ontario_basemap, ontario_border)
tm_shape(ontario_cropped) +
tm_rgb()


brampton_bbox <- c(left = -79.8587, right = -79.6633, bottom = 43.6319, top = 43.7559)
# Query OpenStreetMap for administrative boundaries of Toronto
brampton_border <- opq(bbox = brampton_bbox, timeout=120) |>
add_osm_feature(key = "boundary", value = "administrative") |>
add_osm_feature(key = "admin_level", value = "8") |>
add_osm_feature(key = "type", value = "boundary") |>
add_osm_feature(key = "wikidata", value = "Q44198") |>
add_osm_feature(key = "name", value = "Brampton") |>
osmdata_sf() |>
(\(x) x$osm_multipolygons)()
brampton_border = st_transform(brampton_border, crs = 4326)
brampton_basemap = read_osm(brampton_border, type = "esri-topo")
brampton_border = st_transform(brampton_border, st_crs(brampton_basemap))
brampton_cropped <- st_crop(brampton_basemap, brampton_border)
tm_shape(brampton_cropped) +
tm_rgb()




map_base <- tm_shape(brampton_cropped) +
tm_rgb() +
tm_layout(title = "Brampton Community Projects Base Layer")
print(map_base)
map_with_first <- map_base +
tm_shape(brampton_first) +
tm_dots(col = "red", size = 0.1, popup.vars = c("id", "name"), legend.show = TRUE, title = "2014-17 Projects")
print(map_with_first)
map_with_second <- map_with_first +
tm_shape(brampton_second) +
tm_dots(col = "blue", size = 0.05, popup.vars = c("id", "name"), legend.show = TRUE, title = "2017-20 Projects")
print(map_with_second)
map_with_third <- map_with_second +
tm_shape(brampton_third) +
tm_dots(col = "green", size = 0.025, popup.vars = c("id", "name"), legend.show = TRUE, title = "2020-24 Projects") +
tm_layout(title = "Brampton Community Projects 2014-24",
legend.outside = TRUE,
legend.outside.position = "right", # Position the legend outside the plot to the right
legend.title.size = 1.2,
legend.text.size = 0.8,
legend.bg.color = "white",
legend.bg.alpha = 0.5)
print(map_with_third)





tmap_arrange(healthcare_brampton_first_plot, healthcare_brampton_second_plot, healthcare_brampton_third_plot, ncol = 3)
Error: The shape healthcare_brampton_second only contains empty units.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHRtYXApICMgZm9yIG1ha2luZyB0aGUgbmljZSBwbG90CmxpYnJhcnkob3NtZGF0YSkKbGlicmFyeShPcGVuU3RyZWV0TWFwKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0ZXJyYSkKbGlicmFyeShzcERhdGFMYXJnZSkKbGlicmFyeShzdGFycykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRtYXB0b29scykKYGBgCgpgYGB7cn0Kb250YXJpb19iYm94IDwtIGMobGVmdCA9IC05NS4xNTM3LCByaWdodCA9IC03NC4zMjAyLCBib3R0b20gPSA0MS42NzY2LCB0b3AgPSA1Ni44NTY2KQoKIyBRdWVyeSBPcGVuU3RyZWV0TWFwIGZvciBhZG1pbmlzdHJhdGl2ZSBib3VuZGFyaWVzIG9mIFRvcm9udG8Kb250YXJpb19ib3JkZXIgPC0gb3BxKGJib3ggPSBvbnRhcmlvX2Jib3gsIHRpbWVvdXQ9MTIwKSB8PgogIGFkZF9vc21fZmVhdHVyZShrZXkgPSAiYm91bmRhcnkiLCB2YWx1ZSA9ICJhZG1pbmlzdHJhdGl2ZSIpIHw+IAogIGFkZF9vc21fZmVhdHVyZShrZXkgPSAiSVNPMzE2Ni0yIiwgdmFsdWUgPSAiQ0EtT04iKSB8PgogIGFkZF9vc21fZmVhdHVyZShrZXkgPSAiYWRtaW5fbGV2ZWwiLCB2YWx1ZSA9ICI0IikgfD4gCiAgYWRkX29zbV9mZWF0dXJlKGtleSA9ICJ0eXBlIiwgdmFsdWUgPSAiYm91bmRhcnkiKSB8PiAKICBhZGRfb3NtX2ZlYXR1cmUoa2V5ID0gIndpa2lkYXRhIiwgdmFsdWUgPSAiUTE5MDQiKSB8PiAKICBhZGRfb3NtX2ZlYXR1cmUoa2V5ID0gIm5hbWU6ZW4iLCB2YWx1ZSA9ICJPbnRhcmlvIikgfD4gCiAgb3NtZGF0YV9zZigpIHw+CiAgKFwoeCkgeCRvc21fbXVsdGlwb2x5Z29ucykoKSB8PgogIHNlbGVjdChvc21faWQsYWRtaW5fbGV2ZWwsYm9yZGVyX3R5cGUsbmFtZSxib3VuZGFyeSkKCm9udGFyaW9fYm9yZGVyID0gc3RfdHJhbnNmb3JtKG9udGFyaW9fYm9yZGVyLCBjcnMgPSA0MzI2KQpvbnRhcmlvX2Jhc2VtYXAgPSByZWFkX29zbShvbnRhcmlvX2JvcmRlciwgdHlwZSA9ICJlc3JpLXRvcG8iKQoKCm9udGFyaW9fYm9yZGVyID0gc3RfdHJhbnNmb3JtKG9udGFyaW9fYm9yZGVyLCBzdF9jcnMob250YXJpb19iYXNlbWFwKSkKb250YXJpb19jcm9wcGVkIDwtIHN0X2Nyb3Aob250YXJpb19iYXNlbWFwLCBvbnRhcmlvX2JvcmRlcikKCgp0bV9zaGFwZShvbnRhcmlvX2Nyb3BwZWQpICsKICB0bV9yZ2IoKQoKYGBgCmBgYHtyfQoKY29tbXVuaXR5IDwtIHJlYWRfc2YoJy9Vc2Vycy9ndW5wcmVldHNpbmdoL0Rlc2t0b3AvNjUwMCBEYXRhc2V0cy9Db211bml0eSBidWlsZGluZyBkYXRhL2NvbW11bml0eV9kYXRhLnNocCcpCnJlY3JlYXRpb24gPC0gcmVhZF9zZignL1VzZXJzL2d1bnByZWV0c2luZ2gvRGVza3RvcC82NTAwIERhdGFzZXRzL3JlY3JlYXRpb24gZGF0YS9yZWNyZWF0aW9uLnNocCcpCgpjb21tdW5pdHlfYW5kX3JlY3JlYXRpb24gPC0gcmJpbmQoY29tbXVuaXR5LHJlY3JlYXRpb24pCnllYXJfY291bnQgPC0gdGFibGUoY29tbXVuaXR5X2FuZF9yZWNyZWF0aW9uJFllYXIpCnByaW50KHllYXJfY291bnQpCgpuZXdfZGYgPC0gY29tbXVuaXR5X2FuZF9yZWNyZWF0aW9uIHw+CiAgZmlsdGVyKFN0YXR1cyA9PSAnQ29tcGxldGUnKQoKeWVhcl9jb3VudF9uZXcgPC0gdGFibGUobmV3X2RmJFllYXIpCnByaW50KHllYXJfY291bnRfbmV3KQoKY3JfZmlyc3QgPC0gbmV3X2RmIHw+CiAgZmlsdGVyKFllYXI+PSAyMDE0ICYgWWVhcjw9MjAxNykKCmNyX3NlY29uZCA8LSBuZXdfZGYgfD4KICBmaWx0ZXIoWWVhcj4gMjAxNyAmIFllYXI8PTIwMjApCgpjcl90aGlyZCA8LSBuZXdfZGYgfD4KICBmaWx0ZXIoWWVhcj4gMjAyMCAmIFllYXI8PTIwMjQpCgpjcl9maXJzdF9wbG90IDwtIHRtX3NoYXBlKG9udGFyaW9fY3JvcHBlZCkgKwogIHRtX3JnYigpKwogIHRtX3NoYXBlKGNyX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkrCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiT250YXJpbyBjb21tdW5pdHkgcHJvamVjdHMgMjAxNC0xNyIpCgoKY3Jfc2Vjb25kX3Bsb3QgPC0gdG1fc2hhcGUob250YXJpb19jcm9wcGVkKSArCiAgdG1fcmdiKCkrCiAgdG1fc2hhcGUoY3JfZmlyc3QpICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gMC4xLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShjcl9zZWNvbmQpICsKICB0bV9kb3RzKGNvbCA9ICJibHVlIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAicmVkIiwgbGFiZWxzID0gIjIwMTQtMTciLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJibHVlIiwgbGFiZWxzID0gIjIwMTctMjAiLCBzaXplID0gMC41KSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIk9udGFyaW8gY29tbXVuaXR5IHByb2plY3RzIDIwMTQtMjAiKQoKY3JfdGhpcmRfcGxvdCA8LSB0bV9zaGFwZShvbnRhcmlvX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSsKICB0bV9zaGFwZShjcl9maXJzdCkgKwogIHRtX2RvdHMoY29sID0gInJlZCIsIHNpemUgPSAwLjEsYWxwaGE9MC41LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShjcl9zZWNvbmQpICsKICB0bV9kb3RzKGNvbCA9ICJibHVlIiwgc2l6ZSA9IDAuMDUsYWxwaGE9MC41LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShjcl90aGlyZCkgKwogIHRtX2RvdHMoY29sID0gImdyZWVuIiwgc2l6ZSA9IDAuMDI1LGFscGhhPTAuNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSxsZWdlbmQuc2hvdyA9IEZBTFNFKSsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gInJlZCIsIGxhYmVscyA9ICIyMDE0LTE3Iiwgc2l6ZSA9IDAuNSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAiYmx1ZSIsIGxhYmVscyA9ICIyMDE3LTIwIiwgc2l6ZSA9IDAuNSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAiZ3JlZW4iLCBsYWJlbHMgPSAiMjAyMC0yNCIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiT250YXJpbyBjb21tdW5pdHkgcHJvamVjdHMgMjAxNC0yNCIpCgp0bWFwX2FycmFuZ2UoY3JfZmlyc3RfcGxvdCwgY3Jfc2Vjb25kX3Bsb3QsIGNyX3RoaXJkX3Bsb3QsIG5jb2wgPSAzKQpgYGAKCmBgYHtyfQpicmFtcHRvbl9iYm94IDwtIGMobGVmdCA9IC03OS44NTg3LCByaWdodCA9IC03OS42NjMzLCBib3R0b20gPSA0My42MzE5LCB0b3AgPSA0My43NTU5KQoKIyBRdWVyeSBPcGVuU3RyZWV0TWFwIGZvciBhZG1pbmlzdHJhdGl2ZSBib3VuZGFyaWVzIG9mIFRvcm9udG8KYnJhbXB0b25fYm9yZGVyIDwtIG9wcShiYm94ID0gYnJhbXB0b25fYmJveCwgdGltZW91dD0xMjApIHw+CiAgYWRkX29zbV9mZWF0dXJlKGtleSA9ICJib3VuZGFyeSIsIHZhbHVlID0gImFkbWluaXN0cmF0aXZlIikgfD4gCiAgYWRkX29zbV9mZWF0dXJlKGtleSA9ICJhZG1pbl9sZXZlbCIsIHZhbHVlID0gIjgiKSB8PiAKICBhZGRfb3NtX2ZlYXR1cmUoa2V5ID0gInR5cGUiLCB2YWx1ZSA9ICJib3VuZGFyeSIpIHw+IAogIGFkZF9vc21fZmVhdHVyZShrZXkgPSAid2lraWRhdGEiLCB2YWx1ZSA9ICJRNDQxOTgiKSB8PiAKICBhZGRfb3NtX2ZlYXR1cmUoa2V5ID0gIm5hbWUiLCB2YWx1ZSA9ICJCcmFtcHRvbiIpIHw+IAogIG9zbWRhdGFfc2YoKSB8PgogIChcKHgpIHgkb3NtX211bHRpcG9seWdvbnMpKCkgCgpicmFtcHRvbl9ib3JkZXIgPSBzdF90cmFuc2Zvcm0oYnJhbXB0b25fYm9yZGVyLCBjcnMgPSA0MzI2KQpicmFtcHRvbl9iYXNlbWFwID0gcmVhZF9vc20oYnJhbXB0b25fYm9yZGVyLCB0eXBlID0gImVzcmktdG9wbyIpCgoKYnJhbXB0b25fYm9yZGVyID0gc3RfdHJhbnNmb3JtKGJyYW1wdG9uX2JvcmRlciwgc3RfY3JzKGJyYW1wdG9uX2Jhc2VtYXApKQpicmFtcHRvbl9jcm9wcGVkIDwtIHN0X2Nyb3AoYnJhbXB0b25fYmFzZW1hcCwgYnJhbXB0b25fYm9yZGVyKQoKdG1fc2hhcGUoYnJhbXB0b25fY3JvcHBlZCkgKwogIHRtX3JnYigpCmBgYApgYGB7cn0KY3JfZmlyc3QgPC0gc3RfdHJhbnNmb3JtKGNyX2ZpcnN0LHN0X2NycyhicmFtcHRvbl9ib3JkZXIpKQpicmFtcHRvbl9maXJzdCA8LSBjcl9maXJzdFticmFtcHRvbl9ib3JkZXIsLG9wPXN0X3dpdGhpbl0KCmNyX3NlY29uZCA8LSBzdF90cmFuc2Zvcm0oY3Jfc2Vjb25kLHN0X2NycyhicmFtcHRvbl9ib3JkZXIpKQpicmFtcHRvbl9zZWNvbmQgPC0gY3Jfc2Vjb25kW2JyYW1wdG9uX2JvcmRlciwsb3A9c3Rfd2l0aGluXQoKY3JfdGhpcmQgPC0gc3RfdHJhbnNmb3JtKGNyX3RoaXJkLHN0X2NycyhicmFtcHRvbl9ib3JkZXIpKQpicmFtcHRvbl90aGlyZCA8LSBjcl90aGlyZFticmFtcHRvbl9ib3JkZXIsLG9wPXN0X3dpdGhpbl0KCmJyYW1wdG9uX2ZpcnN0X3Bsb3QgPC0gIHRtX3NoYXBlKGJyYW1wdG9uX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSArCiAgdG1fc2hhcGUoYnJhbXB0b25fZmlyc3QpICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gMC4xLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQoCiAgICB0aXRsZSA9ICJCcmFtcHRvbiBDb21tdW5pdHkgYW5kIFJlY3JlYXRpb25hbCBQcm9qZWN0cyAyMDE0LTE3IiwKICAgIGxlZ2VuZC5vdXRzaWRlID0gRkFMU0UsCiAgICBsZWdlbmQub3V0c2lkZS5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmQudGl0bGUuc2l6ZSA9IDEuMiwKICAgIGxlZ2VuZC50ZXh0LnNpemUgPSAwLjUsCiAgICBsZWdlbmQuYmcuY29sb3IgPSAid2hpdGUiLAogICAgbGVnZW5kLmJnLmFscGhhID0gMC41CiAgKQoKCmJyYW1wdG9uX3NlY29uZF9wbG90IDwtIHRtX3NoYXBlKGJyYW1wdG9uX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSArCiAgdG1fc2hhcGUoYnJhbXB0b25fZmlyc3QpICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gMC4xLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fc2hhcGUoYnJhbXB0b25fc2Vjb25kKSArCiAgdG1fZG90cyhjb2wgPSAiYmx1ZSIsIHNpemUgPSAwLjA1LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImJsdWUiLCBsYWJlbHMgPSAiMjAxNy0yMCIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQoCiAgICB0aXRsZSA9ICJCcmFtcHRvbiBDb21tdW5pdHkgYW5kIFJlY3JlYXRpb25hbCBQcm9qZWN0cyAyMDE0LTIwIiwKICAgIGxlZ2VuZC5vdXRzaWRlID0gRkFMU0UsCiAgICBsZWdlbmQub3V0c2lkZS5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmQudGl0bGUuc2l6ZSA9IDEuMiwKICAgIGxlZ2VuZC50ZXh0LnNpemUgPSAwLjUsCiAgICBsZWdlbmQuYmcuY29sb3IgPSAid2hpdGUiLAogICAgbGVnZW5kLmJnLmFscGhhID0gMC41CiAgKQoKYnJhbXB0b25fdGhpcmRfcGxvdCA8LSB0bV9zaGFwZShicmFtcHRvbl9jcm9wcGVkKSArCiAgdG1fcmdiKCkgKwogIHRtX3NoYXBlKGJyYW1wdG9uX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGJyYW1wdG9uX3NlY29uZCkgKwogIHRtX2RvdHMoY29sID0gImJsdWUiLCBzaXplID0gMC4wNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGJyYW1wdG9uX3RoaXJkKSArCiAgdG1fZG90cyhjb2wgPSAiZ3JlZW4iLCBzaXplID0gMC4wMjUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksIGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gInJlZCIsIGxhYmVscyA9ICIyMDE0LTE3Iiwgc2l6ZSA9IDAuNSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAiYmx1ZSIsIGxhYmVscyA9ICIyMDE3LTIwIiwgc2l6ZSA9IDAuNSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAiZ3JlZW4iLCBsYWJlbHMgPSAiMjAyMC0yNCIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQoCiAgICB0aXRsZSA9ICJCcmFtcHRvbiBDb21tdW5pdHkgYW5kIFJlY3JlYXRpb25hbCBQcm9qZWN0cyAyMDE0LTI0IiwKICAgIGxlZ2VuZC5vdXRzaWRlID0gRkFMU0UgLAogICAgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kLnRpdGxlLnNpemUgPSAxLjIsCiAgICBsZWdlbmQudGV4dC5zaXplID0gMC41LAogICAgbGVnZW5kLmJnLmNvbG9yID0gIndoaXRlIiwKICAgIGxlZ2VuZC5iZy5hbHBoYSA9IDAuNQogICkKCnRtYXBfYXJyYW5nZShicmFtcHRvbl9maXJzdF9wbG90LCBicmFtcHRvbl9zZWNvbmRfcGxvdCwgYnJhbXB0b25fdGhpcmRfcGxvdCwgbmNvbCA9IDMpCmBgYAoKYGBge3IsZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy5oZWlnaHQgPSA2fQp0bV9zaGFwZShicmFtcHRvbl9jcm9wcGVkKSArCiAgdG1fcmdiKCkgKwogIHRtX3NoYXBlKGJyYW1wdG9uX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGJyYW1wdG9uX3NlY29uZCkgKwogIHRtX2RvdHMoY29sID0gImJsdWUiLCBzaXplID0gMC4wNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGJyYW1wdG9uX3RoaXJkKSArCiAgdG1fZG90cyhjb2wgPSAiZ3JlZW4iLCBzaXplID0gMC4wMywgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAicmVkIiwgbGFiZWxzID0gIjIwMTQtMTciLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJibHVlIiwgbGFiZWxzID0gIjIwMTctMjAiLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJncmVlbiIsIGxhYmVscyA9ICIyMDIwLTI0Iiwgc2l6ZSA9IDAuNSkgKwogIHRtX2xheW91dCgKICAgIHRpdGxlID0gIkJyYW1wdG9uIENvbW11bml0eSBhbmQgUmVjcmVhdGlvbmFsIFByb2plY3RzIDIwMTQtMjQiLAogICAgdGl0bGUuc2l6ZSA9IDQsCiAgICBsZWdlbmQub3V0c2lkZSA9IEZBTFNFLAogICAgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kLnRpdGxlLnNpemUgPSAyLAogICAgbGVnZW5kLnRleHQuc2l6ZSA9IDAuOCwKICAgIGxlZ2VuZC5iZy5jb2xvciA9ICJ3aGl0ZSIsCiAgICBsZWdlbmQuYmcuYWxwaGEgPSAwLjUKICApCmBgYApgYGB7cn0KbGlicmFyeShzcGF0c3RhdCkKCm5ld19kZiA8LSBzdF90cmFuc2Zvcm0obmV3X2RmLHN0X2NycyhicmFtcHRvbl9ib3JkZXIpKQpicmFtcHRvbl9jb21tdW5pdHlfZGYgPC0gbmV3X2RmW2JyYW1wdG9uX2JvcmRlciwsb3A9c3Rfd2l0aGluXQoKIyBDaGVjayB0aGUgQ1JTIGFuZCB0cmFuc2Zvcm0gaWYgbmVjZXNzYXJ5CmNvbV9nZGYgPC0gc3RfdHJhbnNmb3JtKGJyYW1wdG9uX2NvbW11bml0eV9kZiwgY3JzID0gMzI2MTcpICAjIFVUTSBab25lIDE3TiwgYWRqdXN0IGJhc2VkIG9uIHlvdXIgbG9jYXRpb24KCiMgQ2FsY3VsYXRlIGJvdW5kaW5nIGJveCBhbmQgY3JlYXRlIG9ic2VydmF0aW9uIHdpbmRvdwpjb21fYmJveCA8LSBzdF9iYm94KGNvbV9nZGYpCmNvbV93aW5kb3cgPC0gb3dpbih4cmFuZ2UgPSBjKGNvbV9iYm94WyJ4bWluIl0sIGNvbV9iYm94WyJ4bWF4Il0pLHlyYW5nZSA9IGMoY29tX2Jib3hbInltaW4iXSwgY29tX2Jib3hbInltYXgiXSkpCgojIENvbnZlcnQgdGhlIHNmIG9iamVjdCB0byBhIHBvaW50IHBhdHRlcm4gKHBwcCkgb2JqZWN0CmNvbV9wcHAgPC0gYXMucHBwKHN0X2Nvb3JkaW5hdGVzKGNvbV9nZGYpLCBXID0gd2luZG93KQoKIyBDYWxjdWxhdGUgS2VybmVsIERlbnNpdHkgRXN0aW1hdGlvbgpjb21fa2RlX2RlbnNpdHkgPC0gZGVuc2l0eShjb21fcHBwLCBzaWdtYSA9IDIwMDAsIGF0ID0gInBpeGVscyIpICAjIFNpZ21hIGlzIHRoZSBiYW5kd2lkdGgsIGFkanVzdCBhcyBuZWVkZWQKCiMgQ29udmVydCBLREUgcmVzdWx0IHRvIGEgcmFzdGVyIG9iamVjdApjb21fa2RlX3Jhc3RlciA8LSByYXN0KGNvbV9rZGVfZGVuc2l0eSkKCiMgU2V0IENSUyBmb3IgdGhlIHJhc3RlcgpjcnMoY29tX2tkZV9yYXN0ZXIpIDwtICJFUFNHOjMyNjE3IgoKIyBQbG90IHRoZSBLREUgdXNpbmcgdG1hcAp0bV9zaGFwZShjb21fa2RlX3Jhc3RlcioxMDAwMDAwKSArCiAgdG1fcmFzdGVyKHBhbGV0dGUgPSBjKCJibHVlIiwgImdyZWVuIiwgInllbGxvdyIsICJyZWQiKSwKICAgICAgICAgICAgdGl0bGUgPSAiS0RFIG9mIENvbW11bml0eSBhbmQgUmVjcmVhdGlvbmFsIEJ1aWxkaW5ncyIpICsKICB0bV9zaGFwZShjb21fZ2RmKSArCiAgdG1fZG90cyhzaXplID0gMC4xLCBjb2wgPSAiYmxhY2siLCB0aXRsZSA9ICJDb21tdW5pdHkgYW5kIFJlY3JlYXRpb25hbCBCdWlsZGluZ3MgTG9jYXRpb25zIikgKwogIHRtX2xheW91dChsZWdlbmQub3V0c2lkZSA9IFRSVUUpCmBgYAoKYGBge3J9CgptYXBfYmFzZSA8LSB0bV9zaGFwZShicmFtcHRvbl9jcm9wcGVkKSArCiAgdG1fcmdiKCkgKwogIHRtX2xheW91dCh0aXRsZSA9ICJCcmFtcHRvbiBDb21tdW5pdHkgUHJvamVjdHMgQmFzZSBMYXllciIpCgpwcmludChtYXBfYmFzZSkKCgptYXBfd2l0aF9maXJzdCA8LSBtYXBfYmFzZSArCiAgdG1fc2hhcGUoYnJhbXB0b25fZmlyc3QpICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gMC4xLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IFRSVUUsIHRpdGxlID0gIjIwMTQtMTcgUHJvamVjdHMiKQoKCnByaW50KG1hcF93aXRoX2ZpcnN0KQoKCm1hcF93aXRoX3NlY29uZCA8LSBtYXBfd2l0aF9maXJzdCArCiAgdG1fc2hhcGUoYnJhbXB0b25fc2Vjb25kKSArCiAgdG1fZG90cyhjb2wgPSAiYmx1ZSIsIHNpemUgPSAwLjA1LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IFRSVUUsIHRpdGxlID0gIjIwMTctMjAgUHJvamVjdHMiKQoKcHJpbnQobWFwX3dpdGhfc2Vjb25kKQoKbWFwX3dpdGhfdGhpcmQgPC0gbWFwX3dpdGhfc2Vjb25kICsKICB0bV9zaGFwZShicmFtcHRvbl90aGlyZCkgKwogIHRtX2RvdHMoY29sID0gImdyZWVuIiwgc2l6ZSA9IDAuMDI1LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IFRSVUUsIHRpdGxlID0gIjIwMjAtMjQgUHJvamVjdHMiKSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIkJyYW1wdG9uIENvbW11bml0eSBQcm9qZWN0cyAyMDE0LTI0IiwKICAgICAgICAgICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFLCAKICAgICAgICAgICAgbGVnZW5kLm91dHNpZGUucG9zaXRpb24gPSAicmlnaHQiLCAgIyBQb3NpdGlvbiB0aGUgbGVnZW5kIG91dHNpZGUgdGhlIHBsb3QgdG8gdGhlIHJpZ2h0CiAgICAgICAgICAgIGxlZ2VuZC50aXRsZS5zaXplID0gMS4yLCAgCiAgICAgICAgICAgIGxlZ2VuZC50ZXh0LnNpemUgPSAwLjgsICAKICAgICAgICAgICAgbGVnZW5kLmJnLmNvbG9yID0gIndoaXRlIiwgIAogICAgICAgICAgICBsZWdlbmQuYmcuYWxwaGEgPSAwLjUpCgoKcHJpbnQobWFwX3dpdGhfdGhpcmQpCmBgYAoKYGBge3J9CgpjaGlsZGNhcmUgPC0gcmVhZF9zZignL1VzZXJzL2d1bnByZWV0c2luZ2gvRGVza3RvcC82NTAwIERhdGFzZXRzL2NoaWxkLWNhcmUgZGF0YS9jaGlsZGNhcmUuc2hwJykKZWR1Y2F0aW9uIDwtIHJlYWRfc2YoJy9Vc2Vycy9ndW5wcmVldHNpbmdoL0Rlc2t0b3AvNjUwMCBEYXRhc2V0cy9lZHVjYXRpb24gZGF0YS9lZHVjYXRpb24uc2hwJykKCmVkdSA8LSByYmluZChjaGlsZGNhcmUsZWR1Y2F0aW9uKQplZHVfeWVhcl9jb3VudCA8LSB0YWJsZShlZHUkWWVhcikKcHJpbnQoZWR1X3llYXJfY291bnQpCgplZHVfbmV3X2RmIDwtIGVkdSB8PgogIGZpbHRlcihTdGF0dXMgPT0gJ0NvbXBsZXRlJykKCmVkdV95ZWFyX2NvdW50X25ldyA8LSB0YWJsZShlZHVfbmV3X2RmJFllYXIpCnByaW50KGVkdV95ZWFyX2NvdW50X25ldykKCmVkdV9maXJzdCA8LSBlZHVfbmV3X2RmIHw+CiAgZmlsdGVyKFllYXI+PSAyMDEyICYgWWVhcjw9MjAxNykKCmVkdV9zZWNvbmQgPC0gZWR1X25ld19kZiB8PgogIGZpbHRlcihZZWFyPiAyMDE3ICYgWWVhcjw9MjAyMCkKCmVkdV90aGlyZCA8LSBlZHVfbmV3X2RmIHw+CiAgZmlsdGVyKFllYXI+IDIwMjAgJiBZZWFyPD0yMDI1KQoKZWR1X2ZpcnN0X3Bsb3QgPC0gdG1fc2hhcGUob250YXJpb19jcm9wcGVkKSArCiAgdG1fcmdiKCkrCiAgdG1fc2hhcGUoZWR1X2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkrCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiT250YXJpbyBFZHVjYXRpb24gYW5kIENoaWxkY2FyZSBQcm9qZWN0cyAyMDE0LTE3IikKCgplZHVfc2Vjb25kX3Bsb3QgPC0gdG1fc2hhcGUob250YXJpb19jcm9wcGVkKSArCiAgdG1fcmdiKCkrCiAgdG1fc2hhcGUoZWR1X2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSxsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fc2hhcGUoZWR1X3NlY29uZCkgKwogIHRtX2RvdHMoY29sID0gImJsdWUiLCBzaXplID0gMC4wNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSxsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImJsdWUiLCBsYWJlbHMgPSAiMjAxNy0yMCIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiT250YXJpbyBFZHVjYXRpb24gYW5kIENoaWxkY2FyZSBQcm9qZWN0cyAyMDE0LTIwIikKCmVkdV90aGlyZF9wbG90IDwtIHRtX3NoYXBlKG9udGFyaW9fY3JvcHBlZCkgKwogIHRtX3JnYigpKwogIHRtX3NoYXBlKGVkdV9maXJzdCkgKwogIHRtX2RvdHMoY29sID0gInJlZCIsIHNpemUgPSAwLjEsYWxwaGE9MC41LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShlZHVfc2Vjb25kKSArCiAgdG1fZG90cyhjb2wgPSAiYmx1ZSIsIHNpemUgPSAwLjA1LGFscGhhPTAuNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSxsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fc2hhcGUoZWR1X3RoaXJkKSArCiAgdG1fZG90cyhjb2wgPSAiZ3JlZW4iLCBzaXplID0gMC4wMjUsYWxwaGE9MC41LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAicmVkIiwgbGFiZWxzID0gIjIwMTQtMTciLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJibHVlIiwgbGFiZWxzID0gIjIwMTctMjAiLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJncmVlbiIsIGxhYmVscyA9ICIyMDIwLTI0Iiwgc2l6ZSA9IDAuNSkgKwogIHRtX2xheW91dCh0aXRsZSA9ICJPbnRhcmlvIEVkdWNhdGlvbiBhbmQgQ2hpbGRjYXJlIFByb2plY3RzIDIwMTQtMjQiKQoKdG1hcF9hcnJhbmdlKGVkdV9maXJzdF9wbG90LCBlZHVfc2Vjb25kX3Bsb3QsIGVkdV90aGlyZF9wbG90LCBuY29sID0gMykKCmBgYAoKYGBge3J9CmVkdV9maXJzdCA8LSBzdF90cmFuc2Zvcm0oZWR1X2ZpcnN0LHN0X2NycyhicmFtcHRvbl9ib3JkZXIpKQplZHVfYnJhbXB0b25fZmlyc3QgPC0gZWR1X2ZpcnN0W2JyYW1wdG9uX2JvcmRlciwsb3A9c3Rfd2l0aGluXQoKZWR1X3NlY29uZCA8LSBzdF90cmFuc2Zvcm0oZWR1X3NlY29uZCxzdF9jcnMoYnJhbXB0b25fYm9yZGVyKSkKZWR1X2JyYW1wdG9uX3NlY29uZCA8LSBlZHVfc2Vjb25kW2JyYW1wdG9uX2JvcmRlciwsb3A9c3Rfd2l0aGluXQoKZWR1X3RoaXJkIDwtIHN0X3RyYW5zZm9ybShlZHVfdGhpcmQsc3RfY3JzKGJyYW1wdG9uX2JvcmRlcikpCmVkdV9icmFtcHRvbl90aGlyZCA8LSBlZHVfdGhpcmRbYnJhbXB0b25fYm9yZGVyLCxvcD1zdF93aXRoaW5dCgplZHVfYnJhbXB0b25fZmlyc3RfcGxvdCA8LSAgdG1fc2hhcGUoYnJhbXB0b25fY3JvcHBlZCkgKwogIHRtX3JnYigpICsKICB0bV9zaGFwZShlZHVfYnJhbXB0b25fZmlyc3QpICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gMC4xLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9sYXlvdXQoCiAgICB0aXRsZSA9ICJCcmFtcHRvbiBFZHVjYXRpb24gYW5kIENoaWxkY2FyZSBQcm9qZWN0cyAyMDE0LTE3IiwKICAgIGxlZ2VuZC5vdXRzaWRlID0gRkFMU0UsCiAgICBsZWdlbmQub3V0c2lkZS5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmQudGl0bGUuc2l6ZSA9IDMsCiAgICBsZWdlbmQudGV4dC5zaXplID0gMC43NSwKICAgIGxlZ2VuZC5iZy5jb2xvciA9ICJ3aGl0ZSIsCiAgICBsZWdlbmQuYmcuYWxwaGEgPSAwLjUKICApCgoKZWR1X2JyYW1wdG9uX3NlY29uZF9wbG90IDwtIHRtX3NoYXBlKGJyYW1wdG9uX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSArCiAgdG1fc2hhcGUoZWR1X2JyYW1wdG9uX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGVkdV9icmFtcHRvbl9zZWNvbmQpICsKICB0bV9kb3RzKGNvbCA9ICJibHVlIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksIGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gInJlZCIsIGxhYmVscyA9ICIyMDE0LTE3Iiwgc2l6ZSA9IDAuNSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAiYmx1ZSIsIGxhYmVscyA9ICIyMDE3LTIwIiwgc2l6ZSA9IDAuNSkgKwogIHRtX2xheW91dCgKICAgIHRpdGxlID0gIkJyYW1wdG9uIEVkdWNhdGlvbiBhbmQgQ2hpbGRjYXJlIFByb2plY3RzIDIwMTQtMjAiLAogICAgbGVnZW5kLm91dHNpZGUgPSBGQUxTRSwKICAgIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC50aXRsZS5zaXplID0gMywKICAgIGxlZ2VuZC50ZXh0LnNpemUgPSAwLjc1LAogICAgbGVnZW5kLmJnLmNvbG9yID0gIndoaXRlIiwKICAgIGxlZ2VuZC5iZy5hbHBoYSA9IDAuNQogICkKCmVkdV9icmFtcHRvbl90aGlyZF9wbG90IDwtIHRtX3NoYXBlKGJyYW1wdG9uX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSArCiAgdG1fc2hhcGUoZWR1X2JyYW1wdG9uX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGVkdV9icmFtcHRvbl9zZWNvbmQpICsKICB0bV9kb3RzKGNvbCA9ICJibHVlIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksIGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShlZHVfYnJhbXB0b25fdGhpcmQpICsKICB0bV9kb3RzKGNvbCA9ICJncmVlbiIsIHNpemUgPSAwLjAyNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAicmVkIiwgbGFiZWxzID0gIjIwMTQtMTciLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJibHVlIiwgbGFiZWxzID0gIjIwMTctMjAiLCBzaXplID0gMC41KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJncmVlbiIsIGxhYmVscyA9ICIyMDIwLTI0Iiwgc2l6ZSA9IDAuNSkgKwogIHRtX2xheW91dCgKICAgIHRpdGxlID0gIkJyYW1wdG9uIEVkdWNhdGlvbiBhbmQgQ2hpbGRjYXJlIFByb2plY3RzIDIwMTQtMjQiLAogICAgdGl0bGUuc2l6ZSA9IDMsCiAgICBsZWdlbmQub3V0c2lkZSA9ICwKICAgIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC50aXRsZS5zaXplID0gMS41LAogICAgbGVnZW5kLnRleHQuc2l6ZSA9IDAuNzUsCiAgICBsZWdlbmQuYmcuY29sb3IgPSAid2hpdGUiLAogICAgbGVnZW5kLmJnLmFscGhhID0gMC41CiAgKQoKdG1hcF9hcnJhbmdlKGVkdV9icmFtcHRvbl9maXJzdF9wbG90LCBlZHVfYnJhbXB0b25fc2Vjb25kX3Bsb3QsIGVkdV9icmFtcHRvbl90aGlyZF9wbG90LCBuY29sID0gMykKYGBgCgpgYGB7cixmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLmhlaWdodCA9IDZ9CnRtX3NoYXBlKGJyYW1wdG9uX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSArCiAgdG1fc2hhcGUoZWR1X2JyYW1wdG9uX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGVkdV9icmFtcHRvbl9zZWNvbmQpICsKICB0bV9kb3RzKGNvbCA9ICJibHVlIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksIGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShlZHVfYnJhbXB0b25fdGhpcmQpICsKICB0bV9kb3RzKGNvbCA9ICJncmVlbiIsIHNpemUgPSAwLjAzLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjUpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImJsdWUiLCBsYWJlbHMgPSAiMjAxNy0yMCIsIHNpemUgPSAwLjUpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImdyZWVuIiwgbGFiZWxzID0gIjIwMjAtMjQiLCBzaXplID0gMC41KSArCiAgdG1fbGF5b3V0KAogICAgdGl0bGUgPSAiQnJhbXB0b24gRWR1Y2F0aW9uIGFuZCBDaGlsZGNhcmUgUHJvamVjdHMgMjAxNC0yNCIsCiAgICB0aXRsZS5zaXplID0gNCwKICAgIGxlZ2VuZC5vdXRzaWRlID0gRkFMU0UsCiAgICBsZWdlbmQub3V0c2lkZS5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmQudGl0bGUuc2l6ZSA9IDMsCiAgICBsZWdlbmQudGV4dC5zaXplID0gMC44LAogICAgbGVnZW5kLmJnLmNvbG9yID0gIndoaXRlIiwKICAgIGxlZ2VuZC5iZy5hbHBoYSA9IDAuNQogICkKYGBgCgoKCmBgYHtyfQoKbGlicmFyeShzcGF0c3RhdCkKbmV3X2VkdV9kZiA8LSBzdF90cmFuc2Zvcm0oZWR1X25ld19kZixzdF9jcnMoYnJhbXB0b25fYm9yZGVyKSkKYnJhbXB0b25fZWR1X2RmIDwtIG5ld19lZHVfZGZbYnJhbXB0b25fYm9yZGVyLCxvcD1zdF93aXRoaW5dCgojIENoZWNrIHRoZSBDUlMgYW5kIHRyYW5zZm9ybSBpZiBuZWNlc3NhcnkKZWR1X2dkZiA8LSBzdF90cmFuc2Zvcm0oYnJhbXB0b25fZWR1X2RmLCBjcnMgPSAzMjYxNykgICMgVVRNIFpvbmUgMTdOLCBhZGp1c3QgYmFzZWQgb24geW91ciBsb2NhdGlvbgoKIyBDYWxjdWxhdGUgYm91bmRpbmcgYm94IGFuZCBjcmVhdGUgb2JzZXJ2YXRpb24gd2luZG93CmVkdV9iYm94IDwtIHN0X2Jib3goZWR1X2dkZikKd2luZG93IDwtIG93aW4oeHJhbmdlID0gYyhlZHVfYmJveFsieG1pbiJdLCBlZHVfYmJveFsieG1heCJdKSwKICAgICAgICAgICAgICAgeXJhbmdlID0gYyhlZHVfYmJveFsieW1pbiJdLCBlZHVfYmJveFsieW1heCJdKSkKCiMgQ29udmVydCB0aGUgc2Ygb2JqZWN0IHRvIGEgcG9pbnQgcGF0dGVybiAocHBwKSBvYmplY3QKZWR1X3BwcCA8LSBhcy5wcHAoc3RfY29vcmRpbmF0ZXMoZWR1X2dkZiksIFcgPSB3aW5kb3cpCgojIENhbGN1bGF0ZSBLZXJuZWwgRGVuc2l0eSBFc3RpbWF0aW9uCmtkZV9kZW5zaXR5IDwtIGRlbnNpdHkoZWR1X3BwcCwgc2lnbWEgPSAxMDAwLCBhdCA9ICJwaXhlbHMiKSAgIyBTaWdtYSBpcyB0aGUgYmFuZHdpZHRoLCBhZGp1c3QgYXMgbmVlZGVkCgojIENvbnZlcnQgS0RFIHJlc3VsdCB0byBhIHJhc3RlciBvYmplY3QKa2RlX3Jhc3RlciA8LSByYXN0KGtkZV9kZW5zaXR5KQoKIyBTZXQgQ1JTIGZvciB0aGUgcmFzdGVyCmNycyhrZGVfcmFzdGVyKSA8LSAiRVBTRzozMjYxNyIKCiMgUGxvdCB0aGUgS0RFIHVzaW5nIHRtYXAKdG1fc2hhcGUoa2RlX3Jhc3RlcioxMDAwMDAwKSArCiAgdG1fcmFzdGVyKHBhbGV0dGUgPSBjKCJibHVlIiwgImdyZWVuIiwgInllbGxvdyIsICJyZWQiKSwKICAgICAgICAgICAgdGl0bGUgPSAiS0RFIG9mIEVkdWNhdGlvbiBhbmQgQ2hpbGRjYXJlIENlbnRlcnMiKSArCiAgdG1fc2hhcGUoZWR1X2dkZikgKwogIHRtX2RvdHMoc2l6ZSA9IDAuMSwgY29sID0gImJsYWNrIiwgdGl0bGUgPSAiRWR1Y2F0aW9uIExvY2F0aW9ucyIpICsKICB0bV9sYXlvdXQobGVnZW5kLm91dHNpZGUgPSBUUlVFKQpgYGAKCgpgYGB7cn0KaGVhbHRoY2FyZSA8LSByZWFkX3NmKCcvVXNlcnMvZ3VucHJlZXRzaW5naC9EZXNrdG9wLzY1MDAgRGF0YXNldHMvaGVhbHRoY2FyZSBkYXRhL2hlYWx0aGNhcmUuc2hwJykKCmhlYWx0aGNhcmVfeWVhcl9jb3VudCA8LSB0YWJsZShoZWFsdGhjYXJlJFllYXIpCnByaW50KGhlYWx0aGNhcmVfeWVhcl9jb3VudCkKCmhlYWx0aGNhcmVfbmV3X2RmIDwtIGhlYWx0aGNhcmUgfD4KICBmaWx0ZXIoU3RhdHVzID09ICdDb21wbGV0ZScpCgpoZWFsdGhjYXJlX3llYXJfY291bnRfbmV3IDwtIHRhYmxlKGhlYWx0aGNhcmVfbmV3X2RmJFllYXIpCnByaW50KGhlYWx0aGNhcmVfeWVhcl9jb3VudF9uZXcpCgpoZWFsdGhjYXJlX2ZpcnN0IDwtIGhlYWx0aGNhcmVfbmV3X2RmIHw+CiAgZmlsdGVyKFllYXI+PSAyMDEyICYgWWVhcjw9MjAxNykKCmhlYWx0aGNhcmVfc2Vjb25kIDwtIGhlYWx0aGNhcmVfbmV3X2RmIHw+CiAgZmlsdGVyKFllYXI+IDIwMTcgJiBZZWFyPD0yMDIwKQoKaGVhbHRoY2FyZV90aGlyZCA8LSBoZWFsdGhjYXJlX25ld19kZiB8PgogIGZpbHRlcihZZWFyPiAyMDIwICYgWWVhcjw9MjAyNSkKCmhlYWx0aGNhcmVfZmlyc3RfcGxvdCA8LSB0bV9zaGFwZShvbnRhcmlvX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSsKICB0bV9zaGFwZShoZWFsdGhjYXJlX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMDUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkrCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjYpICsKICB0bV9sYXlvdXQodGl0bGUgPSAiT250YXJpbyBIZWFsdGhjYXJlIFByb2plY3RzIDIwMTQtMTciKQoKCmhlYWx0aGNhcmVfc2Vjb25kX3Bsb3QgPC0gdG1fc2hhcGUob250YXJpb19jcm9wcGVkKSArCiAgdG1fcmdiKCkrCiAgdG1fc2hhcGUoaGVhbHRoY2FyZV9maXJzdCkgKwogIHRtX2RvdHMoY29sID0gInJlZCIsIHNpemUgPSAwLjEsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGhlYWx0aGNhcmVfc2Vjb25kKSArCiAgdG1fZG90cyhjb2wgPSAiYmx1ZSIsIHNpemUgPSAwLjA1LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gInJlZCIsIGxhYmVscyA9ICIyMDE0LTE3Iiwgc2l6ZSA9IDAuNikgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAiYmx1ZSIsIGxhYmVscyA9ICIyMDE3LTIwIiwgc2l6ZSA9IDAuNikgKwogIHRtX2xheW91dCh0aXRsZSA9ICJPbnRhcmlvIEhlYWx0aGNhcmUgUHJvamVjdHMgMjAxNC0yMCIpCgpoZWFsdGhjYXJlX3RoaXJkX3Bsb3QgPC0gdG1fc2hhcGUob250YXJpb19jcm9wcGVkKSArCiAgdG1fcmdiKCkrCiAgdG1fc2hhcGUoaGVhbHRoY2FyZV9maXJzdCkgKwogIHRtX2RvdHMoY29sID0gInJlZCIsIHNpemUgPSAwLjEsYWxwaGE9MC41LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShoZWFsdGhjYXJlX3NlY29uZCkgKwogIHRtX2RvdHMoY29sID0gImJsdWUiLCBzaXplID0gMC4wNSxhbHBoYT0wLjUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGhlYWx0aGNhcmVfdGhpcmQpICsKICB0bV9kb3RzKGNvbCA9ICJncmVlbiIsIHNpemUgPSAwLjAyNSxhbHBoYT0wLjUsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksbGVnZW5kLnNob3cgPSBGQUxTRSkrCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjYpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImJsdWUiLCBsYWJlbHMgPSAiMjAxNy0yMCIsIHNpemUgPSAwLjYpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImdyZWVuIiwgbGFiZWxzID0gIjIwMjAtMjQiLCBzaXplID0gMC42KSArCiAgdG1fbGF5b3V0KHRpdGxlID0gIk9udGFyaW8gSGVhbHRoY2FyZSBQcm9qZWN0cyAyMDE0LTI0IikKCnRtYXBfYXJyYW5nZShoZWFsdGhjYXJlX2ZpcnN0X3Bsb3QsIGhlYWx0aGNhcmVfc2Vjb25kX3Bsb3QsIGhlYWx0aGNhcmVfdGhpcmRfcGxvdCwgbmNvbCA9IDMpCmBgYAoKCmBgYHtyfQpoZWFsdGhjYXJlX2ZpcnN0IDwtIHN0X3RyYW5zZm9ybShoZWFsdGhjYXJlX2ZpcnN0LHN0X2NycyhicmFtcHRvbl9ib3JkZXIpKQpoZWFsdGhjYXJlX2JyYW1wdG9uX2ZpcnN0IDwtIGhlYWx0aGNhcmVfZmlyc3RbYnJhbXB0b25fYm9yZGVyLCxvcD1zdF93aXRoaW5dCgpoZWFsdGhjYXJlX3NlY29uZCA8LSBzdF90cmFuc2Zvcm0oaGVhbHRoY2FyZV9zZWNvbmQsc3RfY3JzKGJyYW1wdG9uX2JvcmRlcikpCmhlYWx0aGNhcmVfYnJhbXB0b25fc2Vjb25kIDwtIGhlYWx0aGNhcmVfc2Vjb25kW2JyYW1wdG9uX2JvcmRlciwsb3A9c3Rfd2l0aGluXQoKaGVhbHRoY2FyZV90aGlyZCA8LSBzdF90cmFuc2Zvcm0oaGVhbHRoY2FyZV90aGlyZCxzdF9jcnMoYnJhbXB0b25fYm9yZGVyKSkKaGVhbHRoY2FyZV9icmFtcHRvbl90aGlyZCA8LSBoZWFsdGhjYXJlX3RoaXJkW2JyYW1wdG9uX2JvcmRlciwsb3A9c3Rfd2l0aGluXQoKaGVhbHRoY2FyZV9icmFtcHRvbl9maXJzdF9wbG90IDwtICB0bV9zaGFwZShicmFtcHRvbl9jcm9wcGVkKSArCiAgdG1fcmdiKCkgKwogIHRtX3NoYXBlKGhlYWx0aGNhcmVfYnJhbXB0b25fZmlyc3QpICsKICB0bV9kb3RzKGNvbCA9ICJyZWQiLCBzaXplID0gMC4xLCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjgpICsKICB0bV9sYXlvdXQoCiAgICB0aXRsZSA9ICJCcmFtcHRvbiBIZWFsdGhjYXJlIDIwMTQtMTciLAogICAgbGVnZW5kLm91dHNpZGUgPSBGQUxTRSwKICAgIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC50aXRsZS5zaXplID0gMS4yLAogICAgbGVnZW5kLnRleHQuc2l6ZSA9IDAuNzUsCiAgICBsZWdlbmQuYmcuY29sb3IgPSAid2hpdGUiLAogICAgbGVnZW5kLmJnLmFscGhhID0gMC41CiAgKQoKCmhlYWx0aGNhcmVfYnJhbXB0b25fc2Vjb25kX3Bsb3QgPC0gdG1fc2hhcGUoYnJhbXB0b25fY3JvcHBlZCkgKwogIHRtX3JnYigpICsKICB0bV9zaGFwZShoZWFsdGhjYXJlX2JyYW1wdG9uX2ZpcnN0KSArCiAgdG1fZG90cyhjb2wgPSAicmVkIiwgc2l6ZSA9IDAuMSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGhlYWx0aGNhcmVfYnJhbXB0b25fc2Vjb25kKSArCiAgdG1fZG90cyhjb2wgPSAiYmx1ZSIsIHNpemUgPSAwLjA1LCBwb3B1cC52YXJzID0gYygiaWQiLCAibmFtZSIpLCBsZWdlbmQuc2hvdyA9IEZBTFNFKSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJyZWQiLCBsYWJlbHMgPSAiMjAxNC0xNyIsIHNpemUgPSAwLjgpICsKICB0bV9hZGRfbGVnZW5kKHR5cGUgPSAic3ltYm9sIiwgY29sID0gImJsdWUiLCBsYWJlbHMgPSAiMjAxNy0yMCIsIHNpemUgPSAwLjgpICsKICB0bV9sYXlvdXQoCiAgICB0aXRsZSA9ICJCcmFtcHRvbiBIZWFsdGhjYXJlIFByb2plY3RzIDIwMTQtMjAiLAogICAgbGVnZW5kLm91dHNpZGUgPSBGQUxTRSwKICAgIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC50aXRsZS5zaXplID0gMS4yLAogICAgbGVnZW5kLnRleHQuc2l6ZSA9IDAuNzUsCiAgICBsZWdlbmQuYmcuY29sb3IgPSAid2hpdGUiLAogICAgbGVnZW5kLmJnLmFscGhhID0gMC41CiAgKQoKaGVhbHRoY2FyZV9icmFtcHRvbl90aGlyZF9wbG90IDwtIHRtX3NoYXBlKGJyYW1wdG9uX2Nyb3BwZWQpICsKICB0bV9yZ2IoKSArCiAgdG1fc2hhcGUoaGVhbHRoY2FyZV9icmFtcHRvbl9maXJzdCkgKwogIHRtX2RvdHMoY29sID0gInJlZCIsIHNpemUgPSAwLjEsIHBvcHVwLnZhcnMgPSBjKCJpZCIsICJuYW1lIiksIGxlZ2VuZC5zaG93ID0gRkFMU0UpICsKICB0bV9zaGFwZShoZWFsdGhjYXJlX2JyYW1wdG9uX3NlY29uZCkgKwogIHRtX2RvdHMoY29sID0gImJsdWUiLCBzaXplID0gMC4wNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX3NoYXBlKGhlYWx0aGNhcmVfYnJhbXB0b25fdGhpcmQpICsKICB0bV9kb3RzKGNvbCA9ICJncmVlbiIsIHNpemUgPSAwLjAyNSwgcG9wdXAudmFycyA9IGMoImlkIiwgIm5hbWUiKSwgbGVnZW5kLnNob3cgPSBGQUxTRSkgKwogIHRtX2FkZF9sZWdlbmQodHlwZSA9ICJzeW1ib2wiLCBjb2wgPSAicmVkIiwgbGFiZWxzID0gIjIwMTQtMTciLCBzaXplID0gMC44KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJibHVlIiwgbGFiZWxzID0gIjIwMTctMjAiLCBzaXplID0gMC44KSArCiAgdG1fYWRkX2xlZ2VuZCh0eXBlID0gInN5bWJvbCIsIGNvbCA9ICJncmVlbiIsIGxhYmVscyA9ICIyMDIwLTI0Iiwgc2l6ZSA9IDAuOCkgKwogIHRtX2xheW91dCgKICAgIHRpdGxlID0gIkJyYW1wdG9uIEhlYWx0aGNhcmUgUHJvamVjdHMgMjAxNC0yNCIsCiAgICBsZWdlbmQub3V0c2lkZSA9ICwKICAgIGxlZ2VuZC5vdXRzaWRlLnBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZC50aXRsZS5zaXplID0gMS4yLAogICAgbGVnZW5kLnRleHQuc2l6ZSA9IDAuNzUsCiAgICBsZWdlbmQuYmcuY29sb3IgPSAid2hpdGUiLAogICAgbGVnZW5kLmJnLmFscGhhID0gMC41CiAgKQoKdG1hcF9hcnJhbmdlKGhlYWx0aGNhcmVfYnJhbXB0b25fZmlyc3RfcGxvdCwgaGVhbHRoY2FyZV9icmFtcHRvbl9zZWNvbmRfcGxvdCwgaGVhbHRoY2FyZV9icmFtcHRvbl90aGlyZF9wbG90LCBuY29sID0gMykKYGBg